% Parametric nonlinear feature equalization
% for robut speech recognition

%Fs=8000;
[y,Fs] = wavread('wav\FAK_1B.wav');
PAR=setConfig('\','\','wav\');
cx = AASR_Frontend_Multi(y, Fs, PAR); %estraiamo i valori cepstral
co=cx(:,1); %poniamo tutti i C0 in un unico vettore
meanC=mean(co); % calcoliamo la media

j=1;
i=1;
Silence = 0;
Voice = 0;
for cnt=1:length(co)
    if(co(cnt)<=meanC) 
        Silence(j)=co(cnt);
        j=j+1;
    else
        Voice(i)=co(cnt);
        i=i+1;
    end;
end; % inizializziamo i vettori dividendo i C0 secondo che 
     % siano voce o silenzio usando come soglia la media calcolata precedentemente

muSilence=mean(Silence); sigmaSilence=var(Silence); 
muVoice=mean(Voice); sigmaVoice=var(Voice);  %calcoliamo media e varianza delle due distribuzioni iniziali


mu = [ muSilence ; muVoice ];
sigma = cat( 3,sigmaSilence , sigmaVoice );
PComponents = [length(Silence)/length(co) , length(Voice)/length(co)];
S=struct( 'mu' , mu , 'Sigma' , sigma, 'PComponents' , PComponents); % inizializziamo uno struct per date i valori iniziali all'algoritmo EM
options = statset ( 'MaxIter' , 100 , 'Display','final' ); % le opzioni scelte per l'algoritmo EM : iterazioni massime = 100 e Display = final mostra l'output finale dell'algoritmo
gmmCO=gmdistribution.fit(co,2,'Start' , S  , 'Options', options ); % calcola la GMM con i parametri iniziali usando l'algoritmo EM
P = posterior(gmmCO,co); % calcola la probabilita' a posteriori che ogni punto di co appartenga o meno ad una delle due gaussiane che compongono la GMM


x=[-70:0.01:100]; % inizializzazione di un vettore per la funzione pdf
y=pdf(gmmCO,x');
figure;
plot(x,y);

%porcoddio